//
// 线性链表
// Created by 麻再挺 on 2021/1/21.
//

#ifndef DATA_STRUCTURE_C_LINKED_LIST_IMPL_H
#define DATA_STRUCTURE_C_LINKED_LIST_IMPL_H

#include <stdio.h>
#include <stdlib.h>
#include "./../constant.h"

// 定义数据类型
typedef int ElemType;

// 链表结点
typedef struct LNode {
    // 数据
    ElemType data;
    // 下一个链表结点
    struct LNode *next;
}LinkedList;

/**
 * 创建线性链表
 * @param list 链表
 * @return
 */
Status Linked_List_Create(LinkedList *list);

/**
 * 向末尾结点添加数据
 * @param list 链表
 * @param elem 数据
 * @return
 */
Status Linked_List_Push(LinkedList *list, ElemType elem);

/**
 * 向指定位置插入数据
 * @param list 链表
 * @param i 索引
 * @param elem 数据
 * @return
 */
Status Linked_List_Insert(LinkedList *list, int i, ElemType elem);

/**
 * 移除末尾结点数据
 * @param list 链表
 * @return
 */
Status Linked_List_Pop(LinkedList *list);

/**
 * 删除指定位置元素
 * @param list 链表
 * @param i 索引
 * @return
 */
Status Linked_List_Delete(LinkedList *list, int i);

/**
 * 根据索引获取链表数据
 * @param list 链表
 * @param i 索引
 * @param node 数据
 * @return
 */
Status Linked_List_Get_Elem(LinkedList *list, int i, LinkedList *node);

/**
 * 合并两个线性链表, 合并后将值赋值到第一个链表中
 * @param list1 待合并线性链表
 * @param list2 待合并线性链表
 * @return
 */
Status Linked_List_Merge(LinkedList *list1, LinkedList *list2);

/**
 * 打印链表数据
 * @param list 链表
 */
void Linked_List_Print(LinkedList *list);

#endif //DATA_STRUCTURE_C_LINKED_LIST_IMPL_H
